Serialization הוא תהליך של הפיכת אובייקט למחרוזת שאפשר לשמור במסד או לשלוח דרך הרשת. ב-PHP יש פונקציה מובנית בדיוק בשביל זה, והיא נקראת Serialize, שבה, בין היתר, משתמש מנגנון הסשן. ומה אם אני אומר שזו אחת הפונקציות האיטיות והלא יעילות שיש, אבל יש חלופה?
מה זה סריאליזציה?
נניח שאנחנו צריכים לקחת את המערך [1, 2, 'hi'] ולשמור אותו בקובץ או לשלוח אותו בתור הודעה לתוכנית אחרת באינטרנט. השאלה שעולה היא – איך לעשות את זה, הרי כל מה שאנחנו יכולים לשלוח או לשמור בקובץ זה רק טקסט? אני בטוח שעלית על הפתרון, שאומר – צריך לרשום את המערך בצורה טקסטואלית.
סריאליזציה היא פעולה של רישום אובייקט בצורת מחרוזת, והפונקציה Serialize עושה בדיוק את זה.
המערך מהדוגמה הקודמת שלנו יקבל את הצורה הבאה אחרי סריאליזציה:
a:3:{i:0;i:1;i:1;i:2;i:2;s:2:"hi";}
למי שיודע קצת אנגלית לא תהיה שום בעיה לפענח את זה ככה:
a:3:{ // array, size 3
i:0;i:1; // index: 0, value: (integer) 1
i:1;i:2; // index 1, value: (integer) 2
i:2;s:2:"hi"; // index 2, value (string, length 2) "hi"
}
i:0;i:1; // index: 0, value: (integer) 1
i:1;i:2; // index 1, value: (integer) 2
i:2;s:2:"hi"; // index 2, value (string, length 2) "hi"
}
מסובך, ארוך, וכל זה בשביל מערך עם שלושה איברים? למה אנחנו לא יכולים לרשום [1, 2, 'hi'] וזהו?
JSON
JSON, או בשמו המלא JavaScript Object Notation, הוא דרך לרישום אובייקטים שהגיע במקור משפת "נחשו לבד", בזכות הקריאות שלה לבן אדם וקוצר הכתיבה שלה. מהר מאוד היא זכתה לפופולריות ובצדק. תראו איך ייראה המערך שלנו כשהוא מקודד ב-JSON באמצעות הפונקציה json_encode:
[1,2,"hi"]
בדיוק ככה. סוגרים מרובעים מסמנים מערך, מספרים הם מספרים, מחרוזות בגרשיים, וכל זה לפי הסדר. הרבה יותר קריא, קצר ומהיר יותר ליצירה וךפענוח. אבל האמת היא שזה ממילא נשמר בסשן, ולכן למה שזה יהיה קריא?
Igbinary
Igbinary הוא דרך רישום נוסף של נתונים בצורה בינארית ולא טקסטואלית. לדוגמה, בטח שמעת שמספרים תופסים בזיכרון בדרך כלל 4 בתים. אם היינו שומרים מספר כמו 123456789 בתור מחרוזת, היינו תופסים הרבה יותר – את כל תשעת הבתים.
Igbinary הוא הרחבה ל-PHP שמאפשרת לשמור את הסשן בצורה בינארית, כך שהמקום שהוא יתפוס יהיה הרבה יותר נמוך ומהירות העיבוד תהיה גבוהה יותר משמעותית, וכל זה בזכות ההימנעות מפענוח טקסט ועבודה ישירה עם סוגי הנתונים המתאימים.
גרף השוואות המהירויות נראה ככה:
Compact היא אופציה של Igbinary לדחוס את המידע עוד יותר אחרי ההמרה. היא אמנם מורידה את אורך התוצאה, אבל מוסיפה עוד פעולה ביצירה ובפענוח שעושות את התהליך אף איטי יותר מ-Serialize רגיל. הבחירה בין מקום לביצועים נשארת בידכם אחרי ההתקנה, שדורשת קצת קימפולים בלינוקס. למי שיש Windows או שלא רוצה לשמוע את המילה קימפולים יכול לחפש בגוגל איפה אפשר להוריד את php_igbinary.dll לגרסת ה-PHP שלו.
אחרי ההתקנה יש לשנות את הקונפיגורציה של php.ini לשימוש ב-Igbinary בצורה הבאה:
session.serialize_handler = igbinary
בנוסף, Igbinary יכול לשמש גם ב-APC או ב-Memcached לפני השמירה, וההתקנה בשבילם היא אפילו בגדר חובה, כיוון שכמות הסריאליזציות ש-PHP עושה במקרים האלה ממש לא קטנה.
דבר זה הוא מסוג השינויים שכדאי לעשות בשרת הפרודאקשן שלכם ואין ממש טעם לעשות בשרתי Wamp, שממילא כיוון השדרוגים הרצוי בשבילם הוא לא ביצועים.
תגובות לכתבה:
או פשוט להשתמש ב implode
נחמד.
אבל לא מצעתי לזה הרבה שימושים...
@razand
כשאתה עובד לדוגמה מול השרת עם ajax, ואתה מקבל מסה גדולה של נתונים, json פשוט מצילה אותך.
לדוגמה בצ'אט, אתה רוצה לקבל את רשימת ההודעות החדשות של כל משתמש. עם כל הודעה אתה רוצה לקבל את השולח, את הזמן ואת תוכן ההודעה. בהנחה שיש *רק* 25 הודעות חדשות, איך אתה רוצה להעביר אותן? json היא הדרך הכי טובה במקרה הזה.
השימוש היחידי שלה זה סריאליזציה של נתונים בסשן / memcached / apc
אי אפשר להחליף עם זה את json בעבודה מול client כי אין שום דבר בקליינט שמסוגל לפענח או לייצר את זה, וגם אין דרך להפעיל את הפונקציה הזו בצורה עצמאית.
אם אתה מדבר על הקליינט, אין בעיה עם json.
כל הכבוד! כתבה מצויינת,
השתמשתי בעבר הרחוק ב serialize הרגיל,
אין על JSON
אלכס אתה גדול, תודה!
חשוב מאוד לציין כמה דברים בנוגע ל-json.
- json_encode לא זוכרת מאיזו מחלקה נוצר האובייקט. כשנבצע decode כל אובייקט ייחשב כמופע של stdClass.
- אי אפשר לעבוד עם sleep__ ועם wakeup__ עם json.
- רק מאפיינים ציבוריים יעברו סריאליזציה עם json.